﻿using System;
using System.Threading;

namespace homework03_5
{
    // 闹钟事件参数类，用于传递时间信息
    public class ClockEventArgs : EventArgs
    {
        public DateTime CurrentTime { get; }

        public ClockEventArgs(DateTime currentTime)
        {
            CurrentTime = currentTime;
        }
    }

    // 闹钟类
    public class AlarmClock
    {
        // 定义事件
        public event EventHandler<ClockEventArgs> Tick;    // 嘀嗒事件
        public event EventHandler<ClockEventArgs> Alarm;   // 响铃事件

        // 属性
        private DateTime _alarmTime;  // 闹钟设定时间
        private bool _isRunning;      // 闹钟是否运行
        private bool _hasAlarmed;    // 标记是否已响铃

        public DateTime AlarmTime { get; set; }

        public bool IsRunning { get; }

        // 构造函数
        public AlarmClock(DateTime alarmTime)
        {
            _alarmTime = alarmTime;
            _isRunning = false;
        }

        // 开始运行闹钟
        public void Start()
        {
            _isRunning = true;
            _hasAlarmed = false;
            Console.WriteLine("闹钟开始运行...");

            while (_isRunning)
            {
                DateTime currentTime = DateTime.Now;

                // 触发 Tick 事件
                OnTick(currentTime);

                // 检查是否到达闹铃时间
                if (!_hasAlarmed &&
                    currentTime.Hour == _alarmTime.Hour &&
                    currentTime.Minute == _alarmTime.Minute &&
                    currentTime.Second == _alarmTime.Second)
                {
                    OnAlarm(currentTime);
                    _hasAlarmed = true; // 标记已响铃
                }

                // 如果已响铃，等待几秒后停止
                if (_hasAlarmed && (currentTime - _alarmTime).TotalSeconds >= 3)
                {
                    Stop();
                }

                Thread.Sleep(1000); // 每秒嘀嗒一次
            }
        }

        // 停止闹钟
        public void Stop()
        {
            _isRunning = false;
            Console.WriteLine("闹钟已停止。");
        }

        // 触发 Tick 事件
        protected virtual void OnTick(DateTime currentTime)
        {
            Tick?.Invoke(this, new ClockEventArgs(currentTime));
        }

        // 触发 Alarm 事件
        protected virtual void OnAlarm(DateTime currentTime)
        {
            Alarm?.Invoke(this, new ClockEventArgs(currentTime));
        }
    }

    // 主程序
    class Program5
    {
        static void Main1()
        {
            // 设置闹钟响铃时间（当前时间后10秒）
            DateTime alarmTime = DateTime.Now.AddSeconds(10);
            AlarmClock clock = new AlarmClock(alarmTime);

            // 订阅事件
            clock.Tick += Clock_Tick;
            clock.Alarm += Clock_Alarm;

            // 启动闹钟
            clock.Start();

            // 模拟运行一段时间后停止
            Thread.Sleep(15000); // 运行15秒
            clock.Stop();
        }

        // Tick 事件处理方法
        private static void Clock_Tick(object sender, ClockEventArgs e)
        {
            Console.WriteLine($"嘀嗒... 当前时间: {e.CurrentTime:HH:mm:ss}");
        }

        // Alarm 事件处理方法
        private static void Clock_Alarm(object sender, ClockEventArgs e)
        {
            Console.WriteLine($"响铃！闹钟时间到: {e.CurrentTime:HH:mm:ss}");
            // 可以在这里添加更多响铃逻辑，比如循环提示
        }
    }

}

